#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int stepPin = 6; 
const int dirPin = 7; 
const int Ena = 8;
 
const int stepPin2 = 9; 
const int dirPin2 = 10; 
const int Ena2 = 11;
 
const int buttonPin1 = 5;
const int buttonPin2 = 4;
const int buttonPin3 = 3;
const int buttonPin4 = 2;
const int ledPin =  13;
int buttonState1 = 0; 
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int POS[50];
int CC=1;
 
int DT=5;//ระยะห่างตั้งต้น
int Max=0;//ค่ามากสุด
int Step=0;
int AA=0;
void setup() 
{
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  lcd.print("TF, Robot");
  pinMode(ledPin, OUTPUT);
  
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  
 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
  pinMode(Ena,OUTPUT);
 
 digitalWrite(ledPin, HIGH);
 delay(1000);
 LCD();
}
 
 
void loop()
{
 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);
 buttonState3 = digitalRead(buttonPin3);
 buttonState4 = digitalRead(buttonPin4);
 
 
  if (buttonState1 == LOW&&Step==0) ///ลด
  {
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
    DT--;
    LCD();
  } 
  
  else if (buttonState2 == LOW&&Step==0) ///เพิ่ม
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
     DT++;
     LCD();
  } 
 
  
   else  if (buttonState3 == LOW&&Step==0) ///ถัดไป
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
    POS[CC]=DT;
    CC++;
    Max=CC;
    LCD();
  } 
 
  
   else  if (buttonState4 == LOW&&Step==0) ///เริ่ม
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
      digitalWrite(Ena,LOW);
    Step=1;
    CC=0;
   lcd.clear(); 
   lcd.setCursor(0,0);
   lcd.print("GOTO Start");
  }   
 
   else  if (buttonState4 == LOW&&Step>0) ///หยุด
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
    
  }   
else if(Step==1)
{
BK();   
}
else if(Step==2)
{
GO();  
}
else if(Step==3)
{
END();  
}
 
else if(Step==4)
{
  GOhome();  
}
 
 
  else 
  {
    digitalWrite(ledPin, HIGH);
    digitalWrite(Ena,HIGH);
    digitalWrite(stepPin,HIGH);
    digitalWrite(dirPin,HIGH);
  }
  
}
/////////////////-------------------------------------
void GO() 
{
  if(Max==CC)
  {
  digitalWrite(ledPin, LOW);
  delay(1000);
  digitalWrite(ledPin, HIGH);   
   Step++;
   LCD(); 
  }
  //////////------------------------------------------
  else if(AA==(POS[CC]*500)) 
  {
 
 
   CC++; 
   AA=0;
  digitalWrite(ledPin, LOW);
  delay(500);
  digitalWrite(ledPin, HIGH); 
  LCD(); 
  JO();
  }
  //////////-------------------------------------------
  else
  {
  digitalWrite(dirPin,LOW);///หมุนกลับ
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(1000); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(1000); 
  AA++;
  }
}
 
 
 
void BK() 
{
  int sensorValue = analogRead(A0);
  if(sensorValue<=10)
  {
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
  Step++;
  LCD();
  }
  else
  {
    digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
 
  }
}
 
void Print()
{
Serial.print("step= ");
Serial.print(CC);
Serial.print("  POS= ");
Serial.print(DT);
Serial.println();  
}
 
 
 
 
void LCD()
{
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("STEP=");
   lcd.print(CC);
   lcd.setCursor(8,0);
   lcd.print("POS=");
   lcd.print(AA);  
  // lcd.blink();
   
   lcd.setCursor(0,1);
   lcd.print(DT);
   lcd.print(", CM");
   lcd.setCursor(8,1);
   lcd.print("STEP=");
   lcd.print(Step);
 
}
void GOhome()
{
 
  int sensorValue1 = analogRead(A1);
  if(sensorValue1<=10)
  {
     lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("GO home");
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
  Step=0;
  LCD();
  }
  else
  {  
  digitalWrite(dirPin,LOW);//ok
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  }  
}
void END()
{
   lcd.clear(); 
   lcd.setCursor(0,0);
   lcd.print("OK-END"); 
   delay(2000); 
  Step++;
}
void JO()
{
 digitalWrite(dirPin2,LOW);
  for(int x = 0; x < 1000; x++) 
  {
    digitalWrite(stepPin2,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin2,LOW); 
    delayMicroseconds(500); 
  }
  delay(2000); // One second delay
  digitalWrite(dirPin2,HIGH); //Changes the direction of rotation
  
  
  for(int x = 0; x < 1000; x++) 
  {
    digitalWrite(stepPin2,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin2,LOW);
    delayMicroseconds(500);
  }
  delay(2000);  
}
/////////////----------------------------งานประดิษฐ์
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int stepPin = 6; 
const int dirPin = 7; 
const int Ena = 8;
 
const int stepPin2 = 9; 
const int dirPin2 = 10; 
const int Ena2 = 11;
 
const int buttonPin1 = 5;
const int buttonPin2 = 4;
const int buttonPin3 = 3;
const int buttonPin4 = 2;
const int ledPin =  13;
int buttonState1 = 0; 
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int POS[50];
int CC=1;
 
int DT=5;//ระยะห่างตั้งต้น
int Max=0;//ค่ามากสุด
int Step=0;
int AA=0;
void setup() 
{
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  lcd.print("TF, Robot");
  pinMode(ledPin, OUTPUT);
  
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  
 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
  pinMode(Ena,OUTPUT);
 
 digitalWrite(ledPin, HIGH);
 delay(1000);
 LCD();
}
 
 
void loop()
{
 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);
 buttonState3 = digitalRead(buttonPin3);
 buttonState4 = digitalRead(buttonPin4);
 
 
  if (buttonState1 == LOW&&Step==0) ///ลด
  {
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
    DT--;
    LCD();
  } 
  
  else if (buttonState2 == LOW&&Step==0) ///เพิ่ม
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
     DT++;
     LCD();
  } 
 
  
   else  if (buttonState3 == LOW&&Step==0) ///ถัดไป
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
    POS[CC]=DT;
    CC++;
    Max=CC;
    LCD();
  } 
 
  
   else  if (buttonState4 == LOW&&Step==0) ///เริ่ม
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
      digitalWrite(Ena,LOW);
    Step=1;
    CC=0;
   lcd.clear(); 
   lcd.setCursor(0,0);
   lcd.print("GOTO Start");
  }   
 
   else  if (buttonState4 == LOW&&Step>0) ///หยุด
  {
    digitalWrite(ledPin, LOW);
        delay(500);
    digitalWrite(ledPin, HIGH);
    
  }   
else if(Step==1)
{
BK();   
}
else if(Step==2)
{
GO();  
}
else if(Step==3)
{
END();  
}
 
else if(Step==4)
{
  GOhome();  
}
 
 
  else 
  {
    digitalWrite(ledPin, HIGH);
    digitalWrite(Ena,HIGH);
    digitalWrite(stepPin,HIGH);
    digitalWrite(dirPin,HIGH);
  }
  
}
/////////////////-------------------------------------
void GO() 
{
  if(Max==CC)
  {
  digitalWrite(ledPin, LOW);
  delay(1000);
  digitalWrite(ledPin, HIGH);   
   Step++;
   LCD(); 
  }
  //////////------------------------------------------
  else if(AA==(POS[CC]*500)) 
  {
 
 
   CC++; 
   AA=0;
  digitalWrite(ledPin, LOW);
  delay(500);
  digitalWrite(ledPin, HIGH); 
  LCD(); 
  JO();
  }
  //////////-------------------------------------------
  else
  {
  digitalWrite(dirPin,LOW);///หมุนกลับ
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(1000); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(1000); 
  AA++;
  }
}
 
 
 
void BK() 
{
  int sensorValue = analogRead(A0);
  if(sensorValue<=10)
  {
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
  Step++;
  LCD();
  }
  else
  {
    digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
 
  }
}
 
void Print()
{
Serial.print("step= ");
Serial.print(CC);
Serial.print("  POS= ");
Serial.print(DT);
Serial.println();  
}
 
 
 
 
void LCD()
{
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("STEP=");
   lcd.print(CC);
   lcd.setCursor(8,0);
   lcd.print("POS=");
   lcd.print(AA);  
  // lcd.blink();
   
   lcd.setCursor(0,1);
   lcd.print(DT);
   lcd.print(", CM");
   lcd.setCursor(8,1);
   lcd.print("STEP=");
   lcd.print(Step);
 
}
void GOhome()
{
 
  int sensorValue1 = analogRead(A1);
  if(sensorValue1<=10)
  {
     lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("GO home");
    digitalWrite(ledPin, LOW);
    delay(500);
    digitalWrite(ledPin, HIGH);
  Step=0;
  LCD();
  }
  else
  {  
  digitalWrite(dirPin,LOW);//ok
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  }  
}
void END()
{
   lcd.clear(); 
   lcd.setCursor(0,0);
   lcd.print("OK-END"); 
   delay(2000); 
  Step++;
}
void JO()
{
 digitalWrite(dirPin2,LOW);
  for(int x = 0; x < 1000; x++) 
  {
    digitalWrite(stepPin2,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin2,LOW); 
    delayMicroseconds(500); 
  }
  delay(2000); // One second delay
  digitalWrite(dirPin2,HIGH); //Changes the direction of rotation
  
  
  for(int x = 0; x < 1000; x++) 
  {
    digitalWrite(stepPin2,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin2,LOW);
    delayMicroseconds(500);
  }
  delay(2000);  
}